package com.zjsru.plan2024.oneday;

import java.util.Arrays;

/**
 * 2028. 找出缺失的观测数据
 * @Author: cookLee
 * @Date: 2024-05-27
 */
public class MissingRolls {

    /**
     * 主
     * 返回一个长度为 n 的数组，包含所有缺失的观测数据，且满足这 n + m 次投掷的 平均值 是 mean 。如果存在多组符合要求的答案，只需要返回其中任意一组即可。如果不存在答案，返回一个空数组。
     * k 个数字的 平均值 为这些数字求和后再除以 k 。
     * 注意 mean 是一个整数，所以 n + m 次投掷的总和需要被 n + m 整除。
     * \
     * \
     * 输入：rolls = [3,2,4,3], mean = 4, n = 2
     * 输出：[6,6]
     * 解释：所有 n + m 次投掷的平均值是 (3 + 2 + 4 + 3 + 6 + 6) / 6 = 4 。
     * \
     * 输入：rolls = [1,5,6], mean = 3, n = 4
     * 输出：[2,3,2,2]
     * 解释：所有 n + m 次投掷的平均值是 (1 + 5 + 6 + 2 + 3 + 2 + 2) / 7 = 3 。
     * \
     * 输入：rolls = [1,2,3,4], mean = 6, n = 4
     * 输出：[]
     * 解释：无论丢失的 4 次数据是什么，平均值都不可能是 6 。
     * \
     * @param args args
     */
    public static void main(String[] args) {
        MissingRolls missingRolls = new MissingRolls();
        int[] rolls = new int[]{1,5,6};
        int mean = 3;
        int n = 4;
        System.out.println(Arrays.toString(missingRolls.missingRolls(rolls, mean, n)));
    }

    /**
     * 模拟
     *
     * @param rolls 轧辊
     * @param mean  平均值
     * @param n     n
     * @return {@link int[]}
     */
    public int[] missingRolls(int[] rolls, int mean, int n) {
        int m = rolls.length;
        //题意，获取总数
        int sum = (m + n) * mean;
        //定义一个缺失数据
        int missingSum = sum;
        //获取剩余值
        for (Integer roll : rolls) {
            missingSum -= roll;
        }
        //判断是否满足要求,如果剩余数字大于或者小于能够获得数字，那么平均数不够
        if (missingSum > 6 * n || missingSum < n) {
            return new int[0];
        }
        int quality = missingSum / n;
        int remainder = missingSum % n;
        int[] ans = new int[n];
        //其中一种方案：在缺失的 n 个观测数据中，有 remainder 个观测数据是 quality+1，其余观测数据都是 quality。
        for (int i = 0; i < n; i++) {
            ans[i] = quality + (i < remainder ? 1 : 0);
        }
        return ans;
    }
}
